package com.coderman.daoclient.connections;

import com.coderman.daoclient.bean.KVPair;
import com.coderman.daoclient.reflect.BeanMapInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * Created by ${fanchunshuai} on 2017-7-27.
 *
 * @version: V1.0
 * @Desc:
 */
public   interface AbstractStatementTask<T,I> extends com.coderman.daoclient.connections.StatementFactory {


    /**
     * 以对象的方式插入一条记录db
     * @param t
     * @return 当前插入的行记录id
     * @throws Exception 返回-1L or 0L
     */
    Long exeInsert(T t) throws Exception;

    /**
     * 以对象的方式修改记录
     * 默认根据主键id删除
     * @param t
     * @throws Exception
     */
     int exeUpdate(T t) throws Exception;

    /**
     * 以对象的方式修改记录
     * 根据column-value的方式修改
     * @param clazzBean  对象class
     * @param list  修改的列和值
     * @param idPair  id主键的名称和值
     * @throws Exception
     */
    int exeUpdate(Class clazzBean, List<KVPair> list, KVPair idPair)throws Exception;


    /**
     * 以对象的方式修改记录
     * 根据column-value的方式修改
     * @param t
     * @param list
     * @throws Exception
     */
    int exeUpdate(T t, List<KVPair> list)throws Exception;

    /**
     * 以对象的方式删除记录
     * @param clazz
     * @throws Exception
     */
    int exeDelete(Class<?> clazz,I id) throws Exception;

    /**
     * 根据主键id查询记录
     * @param clazz
     * @throws Exception
     */
    <T> T exeQueryTID(Class<?> clazz,I id) throws Exception;


    /**
     * 以对象的方式查询总条数
     * @param clazz
     * @return
     * @throws Exception
     */
    Long exeQueryCount(Class<?> clazz) throws Exception;

    /**
     * 以对象的方式查询总条数
     * @param clazz 要查询的对象
     * @param list 查询参数列表
     * @return
     * @throws Exception
     */
    Long exeQueryCount(Class<?> clazz,List<KVPair> list) throws Exception;


    /**
     * 根据条件查询信息
     * @param clazzBean
     * @param list
     * @param <T>
     * @return
     * @throws Exception
     */
    <T> List<T> getList(Class<T> clazzBean,List<KVPair> list) throws Exception;

    /**
     * 根据sql查询，返回对象列表
     * @param clazzBean
     * @param sql
     * @param <T>
     * @return
     */
     <T> List<T> getList(Class<T> clazzBean,String sql) throws Exception;

    /**
     * 根据两个字段获取map形式的数据结构
      * @param keyColumn
     * @param valueColumn
     * @return
     * @throws Exception
     */
     Map<String,String> getMap(Class<T> clazzBean,String keyColumn,String valueColumn) throws Exception;



}
